-- 创建数据库
CREATE DATABASE AgriculturalSales;
GO
USE AgriculturalSales;
GO

-- 创建Users表 - 用户信息表
CREATE TABLE Users (
    UserId INT IDENTITY(5301,1) PRIMARY KEY, -- 用户唯一标识
    UserName NVARCHAR(50) NOT NULL, -- 用户名字
    Password NVARCHAR(100) NOT NULL, -- 用户密码
    Phone NVARCHAR(20), -- 用户电话
    UserImagee NVARCHAR(200), -- 用户头像显示
    Address NVARCHAR(200), -- 用户地址
    UserType NVARCHAR(10) NOT NULL CHECK (UserType IN ('管理员', '普通用户')) -- 用户类型
);

-- 创建ProductCategory表 - 产品分类表
CREATE TABLE ProductCategory (
    CategoryId INT IDENTITY(1,1) PRIMARY KEY, -- 分类编号
    CategoryName NVARCHAR(100) NOT NULL -- 分类名称
);

-- 创建Product表 - 产品信息表
CREATE TABLE Product (
    ProductId INT IDENTITY(1001,1) PRIMARY KEY, -- 产品编号
    CategoryId INT NOT NULL, -- 分类编号，外键
    UserId INT NOT NULL, -- 管理员编号，外键
    Name NVARCHAR(100) NOT NULL, -- 产品名字
    Origin NVARCHAR(100), -- 产品原产地
    Price DECIMAL(10,2) NOT NULL, -- 产品价格
    Inventory INT NOT NULL, -- 产品库存数量
    Unit NVARCHAR(20), -- 产品售卖单位
    Descr NVARCHAR(500), -- 产品描述
    ImageUrl NVARCHAR(200), -- 产品图片地址
    CONSTRAINT FK_Product_Category FOREIGN KEY (CategoryId) REFERENCES ProductCategory(CategoryId),
    CONSTRAINT FK_Product_User FOREIGN KEY (UserId) REFERENCES Users(UserId)
);

-- 创建Order表 - 订单信息表
CREATE TABLE [Order] (
    OrderId INT IDENTITY(2001,1) PRIMARY KEY, -- 订单编号
    UserId INT NOT NULL, -- 用户编号，外键
    OrderNum INT NOT NULL, -- 订单数量
    OrderState NVARCHAR(20) NOT NULL CHECK (OrderState IN ('待支付', '已支付', '已发货', '已完成', '已取消')), -- 订单状态
    TotalAmout DECIMAL(10,2) NOT NULL, -- 总金额
    DeliveryAddr NVARCHAR(200), -- 发货地址
    ContactPhone NVARCHAR(20), -- 联系电话
    UpdateAt DATETIME NOT NULL DEFAULT GETDATE(), -- 订单状态更新时间
    CONSTRAINT FK_Order_User FOREIGN KEY (UserId) REFERENCES Users(UserId)
);

-- 创建OrderProduct表 - 订单产品关联表
CREATE TABLE OrderProduct (
    OrderId INT NOT NULL, -- 订单编号
    ProductId INT NOT NULL, -- 产品编号
    PRIMARY KEY (OrderId, ProductId), -- 复合主键
    CONSTRAINT FK_OrderProduct_Order FOREIGN KEY (OrderId) REFERENCES [Order](OrderId),
    CONSTRAINT FK_OrderProduct_Product FOREIGN KEY (ProductId) REFERENCES Product(ProductId)
);

-- 创建Payment表 - 支付信息表
CREATE TABLE Payment (
    PayId INT IDENTITY(3001,1) PRIMARY KEY, -- 支付编号
    OrderId INT NOT NULL, -- 订单编号，外键
    PayMethod NVARCHAR(20) NOT NULL CHECK (PayMethod IN ('微信支付', '支付宝', '银行卡', '货到付款')), -- 支付方式
    PayAmout DECIMAL(10,2) NOT NULL, -- 支付金额
    PayState NVARCHAR(20) NOT NULL CHECK (PayState IN ('未支付', '支付成功', '支付失败', '已退款')), -- 支付状态
    PayTime DATETIME NOT NULL DEFAULT GETDATE(), -- 支付时间
    CONSTRAINT FK_Payment_Order FOREIGN KEY (OrderId) REFERENCES [Order](OrderId)
);